# 将文件保存到FastDFS服务器上，
# 需要自定义文件存储系统。
from django.conf import settings
from django.core.files.storage import Storage
from fdfs_client.client import Fdfs_client
from  django.utils.deconstruct import  deconstructible


# 为存储类FastDFSStorage添加装饰器
@deconstructible()
class FastDFSStorage(Storage):
    # 指明路径
    def __init__(self, conf_client=None, base_url=None):
        # 判断文件的路径
        if conf_client is None:
            conf_client = settings.CLIENT_CONFIG
        self.conf_client = conf_client

        # 判断文件的URL
        if base_url is None:
            base_url = settings.FDFS_URL
        self.base_url = base_url

    # 定义打开文件的方法
    def _open(self, name, mode='rb'):
        """
          用不到打开文件
        """
        pass

    # 保存文件（自定义Django文件存储系统）的方法(name是传入的文件名，content是Django接收到的文件内容)
    def _save(self, name, content):
        # 上传文件需要先创建fdfs_client.client.Fdfs_client的对象
        # 并指明配置文件
        client = Fdfs_client(self.conf_client)

        # 上传文件（二进制）
        ret = client.upload_by_buffer(content.read())

        # 判断文件是否上传成功
        if ret.get("Status") != "Upload successed.":
            raise Exception("upload file failed")

        # 提取文件filed_id(图片唯一标示)
        file_name = ret.get("Remote file_id")
        return file_name

    # 构建图片路径链接的方法
    def url(self, name):
        return self.base_url + name

    # 对重复的名字进行判断
    def exists(self, name):
        return False  # 默认没有重复的名字
